package com.shockweb.common.arithmetic;

import java.util.LinkedList;
import java.util.NoSuchElementException;



/**
 * 实现一个线程安全的队列
 * @author pengminghua
 *
 * @param <T>
 */
public class Queue<T> {
	
	private static Object Lock = new Object();
	
	private LinkedList<T> queue = new LinkedList<T>();
	
	/**
	 * 判断队列是否为空
	 * @return boolean
	 */
	public boolean isEmpty(){
		return queue.isEmpty();
	}
	
	/**
	 * 往队列尾部加入一个参数
	 * @param o
	 */
	public void offer(T o){
		synchronized(Lock){
			queue.add(o);
		}
	}

	/**
	 * 删除队列头元素
	 * @throws NoSuchElementException
	 */
	public void remove() throws NoSuchElementException{
		synchronized(Lock){
			if(queue.isEmpty()){
				throw new NoSuchElementException("queue is empty");
			}
			queue.removeFirst();
		}
	}
	
	/**
	 * 返回队列头元素，不删除该元素
	 * @return T
	 * @throws NoSuchElementException
	 */
	public T peek() throws NoSuchElementException{
		synchronized(Lock){
			if(queue.isEmpty()){
				throw new NoSuchElementException("queue is empty");
			}
			return queue.getFirst();
		}
	}

	/**
	 * 返回队列头元素，同时删除该元素
	 * @return T
	 * @throws NoSuchElementException
	 */
	public T poll() throws NoSuchElementException{
		synchronized(Lock){
			if(queue.isEmpty()){
				throw new NoSuchElementException("queue is empty");
			}
			T o = queue.getFirst();
			queue.removeFirst();
			return o;
		}
	}
}
